/**
 *  对话框确认,组装目标源转换属性字段
 * @param dialog 对话框
 * @returns
 */
function assembleConvertFields(dialog) {
	// 获取目标源转换属性输入值
	var info = dialog.getModalContent();
	var $propertyConvertList = $(info).find("#propertyConvertList");
	var trs = $propertyConvertList.find("tr");
	// 获取驱动连接器配置
	var targetMapping = driver.targetMapping;
	targetMapping.convertor = (undefined == targetMapping.convertor || targetMapping.convertor == null) ? {}
			: targetMapping.convertor;
	// 获取目标源属性名称
	var $index = $propertyConvertList.attr("index");
	var convertor = targetMapping.convertor;
	if (trs.length < 1) {
		// 清空属性
		delete convertor[$index];
		return;
	}
	// 获取转换属性"ID": [{"prepend": [ "这是前缀"]}, {"append": ["这是后缀" ] }]
	convertor[$index] = [];
	trs.each(function(i, o) {
		// 定义转换对象
		var converObj = {};
		// 获取操作类型
		var opr = $(this).find("td:eq(0)").attr("value");
		// 定义操作值为数组，因为有多个参数
		var obj = converObj[opr];
		converObj[opr] = [];
		// 获取参数
		var tds = $(this).find("td:eq(1) span");
		$.each(tds, function(i, v) {
			var paras = $(tds[i]).text();
			converObj[opr].push(paras);
		});
		convertor[$index].push(converObj);
	});
}

/**
 * 生成预览文本
 * @param $propertyConvertList 操作列表
 * @param $propertyConverPreview 预览文本存放元素标签
 * @returns
 */
function createConvertPreviewCommond($propertyConvertList, $propertyConverPreview){
	// 清空预览文本
	$propertyConverPreview.empty();
	// 默认转换前和转换的文本示例 '张三'
	var previewBeforeText = previewAfterText = '张三';
	// 遍历操作列表
	var trs = $propertyConvertList.find("tr");
	trs.each(function(i, o) {
		// 获取操作类型
		var operator = $(this).find("td:eq(0)").attr("value");
		// 获取参数
		var tds = $(this).find("td:eq(1) span");
		var p1 = $(tds[0]).text();
		var p2 = $(tds[1]).text();

		// 目标源转换转换操作处理
		switch (operator) {
		case 'replace':
			//拼接预览文本
			previewBeforeText += p1;
			//拼接处理后的文本
			previewAfterText = previewAfterText + p1.replace(p1, p2);
			break;
		case 'prepend':
			previewBeforeText = p1 + previewBeforeText;
			previewAfterText = p1 + previewAfterText;
			break;
		case 'append':
			previewBeforeText += p1;
			previewAfterText = previewAfterText + p1;
			break;
		default:
			break;
		}
	});

	// 生成预览效果
	var previewHtml = previewBeforeText + '<b>&nbsp;转换后&nbsp;</b>' + previewAfterText;
	$propertyConverPreview.append(previewHtml);
	
	// 判断如果操作列表为空，则清空预览文本
	if (trs.length == 0) {
		// 清空预览文本
		$propertyConverPreview.empty();
	}
}

/**
 * 绑定添加转换按钮事件
 * @param $dialogHtml 对话框页面
 * @returns
 */
function bindEventForAddConvertCondition($dialogHtml){
	// 新增转换按钮
	var $propertyConvertAdd = $dialogHtml.find("#propertyConvertAdd");
	// 操作列表
	var $propertyConvertList = $dialogHtml.find("#propertyConvertList");
	// 下拉操作
	var $propertyConvertOperator = $dialogHtml.find("#propertyConvertOperator");
	// 预览
	var $propertyConverPreview = $dialogHtml.find('#propertyConverPreview');

	// 绑定添加转换按钮事件
	$propertyConvertAdd.click(function() {
		// 获取转换下拉
		var propertyConvertOperator = $propertyConvertOperator.find(":selected").text();
		var operatorValue = $propertyConvertOperator.find(":selected").val();

		// 参数区域
		var $propertyConvertParas = $dialogHtml.find('input[name="propertyConvertParas"]');

		// 对同步属性转换表单进行必填校验
		if ($dialogHtml.formValidate() == false) {
			return false;
		}
		
		// 循环添加参数
		var propertyConvertParaValue = '';
		$.each($propertyConvertParas, function(i, v) {
			var desc = i > 0 ? '&nbsp;为&nbsp;' : '';
			propertyConvertParaValue += desc + '<span class="badge">'+ v.value + '</span>';
			// 清空参数
			$(v).val('');
		});
		var html = '';
		html += "<tr>";
		html += "<td value='" + operatorValue + "'>"+ propertyConvertOperator + "</td>";
		html += "<td>" + propertyConvertParaValue + "</td>";
		html += "<td><a class='fa fa-remove fa-2x propertyConvertDelete fastsyncer_pointer' title='删除' ></a></td>";
		html += "</tr>";
		$propertyConvertList.append(html);
		
		// 绑定同步属性转换删除事件
		// 获取转换列表删除元素
		var $propertyConvertDelete = $dialogHtml.find(".propertyConvertDelete");
		bindEventForDeleteConvertProperty($propertyConvertDelete, $propertyConvertList, $propertyConverPreview);

		// 展示预览结果
		createConvertPreviewCommond($propertyConvertList,$propertyConverPreview);
	});
}

/**
 * 删除同步属性转换预览条件
 * @param $propertyConvertDelete 删除元素
 * @param $propertyConvertList 转换操作列表
 * @param $propertyConverPreview 预览标签元素
 * @returns
 */
function bindEventForDeleteConvertProperty($propertyConvertDelete, $propertyConvertList, $propertyConverPreview) {
	$propertyConvertDelete.click(function() {
		// 删除tr
		$(this).parent().parent().remove();
		// 重新生成预览结果
		createConvertPreviewCommond($propertyConvertList, $propertyConverPreview);
	});
}

/**
 * 初始化目标源同步属性参数框
 * @param $dialogHtml 弹出框页面
 * @returns
 */
function initPropertyConvertPara($dialogHtml){
	//初始化一个参数框
	var paraHtml = '<div class="col-md-4">'
			+'<div class="form-group">'
			+'<label class="col-sm-3 control-label">参数</label>'
			+'<div class="col-sm-9">'
			+'<input type="text" name="propertyConvertParas" class="form-control" asd-valid="require">'
			+'</div>'
			+'</div>'
			+'</div>';
	
	//默认设置参数框，根据设置的argNum参数框个数决定
	var $propertyConvertInput = $dialogHtml.find('#propertyConvertInput');
	var $propertyConvertOperator = $dialogHtml.find("select[name='operator']");
	var defalutArgNum = $propertyConvertOperator.find(':selected').attr('argNum');
	// 循环下拉框确定参数个数
	var defalutParaHtml = '';
	$propertyConvertInput.empty();
	defalutArgNum = parseInt(defalutArgNum);
	for (var i = 0; i < defalutArgNum; i++) {
		defalutParaHtml += paraHtml;
	}
	$propertyConvertInput.append(defalutParaHtml);
	
	// 绑定操作切换事件
	$propertyConvertOperator.change(function() {
		var operatorCount = $(this).find(':selected').attr('argNum');
		// 循环下拉框确定参数个数
		var html = '';
		$propertyConvertInput.empty();
		for (var i = 0; i < parseInt(operatorCount); i++) {
			html += paraHtml;
		}
		$propertyConvertInput.append(html);
	});
}

/**
 * 初始化已有目标源同步属性列表
 * @param $dialogHtml 弹出框页面
 * @param list 显示操作操作列表
 * @returns
 */
function initPropertyConvertList($dialogHtml, list){
	var $propertyConvertList = $dialogHtml.find("#propertyConvertList");
	// 获取预览Code标签元素
	var $propertyConverPreview = $dialogHtml.find('#propertyConverPreview');
	// 获取目标源属性名称
	var targetPropertyName = $dialogHtml.find('.targetProperty').text();

	// 判断属性值是否存在
	if(!list || typeof list == undefined){
		return;
	}
	//遍历已有条件列表
	//操作配置 例如:[{"replace": [ "1","男"]},{ "prepend": [ "asd" ] } ]
	var len = list.length;
	//添加转换条件
	var html = '';
	for (var i = 0; i < len; i++) {
		var attr = list[i];
		$.each(attr, function(value) {
			// {"replace": [ "1","男"]}
			var operator = attr[value];
			// 循环回显参数
			var arg = '';
			$.each(operator, function(i, value) {
				var desc = i > 0 ? '&nbsp;为&nbsp;' : '';
				arg += desc + '<span class="badge">' + operator[i] + '</span>';
			});
			html += "<tr>";
			html += "<td value='"+value+"'>"+DriverConvertType[value]['name']+"</td>";
			html += "<td>"+arg+"</td>";
			html += "<td><a class='fa fa-remove fa-2x propertyConvertDelete fastsyncer_pointer' title='删除' ></a></td>";
			html += "</tr>";
		});
	}
	$propertyConvertList.append(html);
	
	// 绑定同步属性转换删除事件
	// 获取转换列表删除元素
	var $propertyConvertDelete = $dialogHtml.find(".propertyConvertDelete");
	bindEventForDeleteConvertProperty($propertyConvertDelete, $propertyConvertList, $propertyConverPreview);
	
	//展示预览结果
	createConvertPreviewCommond($propertyConvertList, $propertyConverPreview);
}

//创建所有支持的转换类型select下拉代码<option>xxx</option>
function createConverOperatorHtml(){
	var convertOperatorHtml = "";
	var v;
	for ( var key in DriverConvertType) {
		v = DriverConvertType[key];
		// <option value="replace" argNum="2">替换</option>
		convertOperatorHtml += '<option value="'+key+'" argNum="'+v["argNum"]+'">'+v["name"]+'</option>';
	}
	return convertOperatorHtml;
}

//为基本配置中表格的Tr绑定转换目标源同步属性按钮事件
function bindEventForClickPropertyList($propertyList) {
	var $propertyTr = $propertyList.find("tr");
	
	// 移除上次绑定click事件，防止事件被重复绑定
	$propertyTr.unbind('click');
	
	$propertyTr.click(function() {
		//取数据源，目标源属性值
		var sourceProperty =  $(this).find('td:eq(0)').text();
		var targetProperty =  $(this).find('td:eq(1)').text();
		//转换器配置序号
		var index = $(this).attr("index");
	
		//创建所有支持的转换类型select下拉代码<option>xxx</option>
		var convertOptHtml = createConverOperatorHtml();
		
		// 初始化对话框
		var $dialogHtml =$('<div class="row">'
			+'<!-- 数据源属性-->'
			+'<div class="col-md-5">'
			+'<h4 class="sourceProperty">'+sourceProperty+'</h4>'
			+'</div>'
			
			+'<!-- 中间图标 -->'
			+'<div class="col-md-2 text-center outer">'
			+'<span class="fa fa-angle-double-right fa-2x"></span>'
			+'</div>'
			
			+'<!-- 目标源属性-->'
			+'<div class="col-md-5 text-right">'
			+'<h4 class="targetProperty">'+targetProperty+'</h4>'
			+'</div>'
			+'</div>'
			
			+'<!-- 转换配置-->'
			+'<form class="form-horizontal" role="form">'
			+'<br />'
			+'<div class="row">'
			+'<div class="col-md-4">'
			+'<div class="form-group">'
			+'<label class="col-sm-3 control-label">操作</label>'
			+'<div class="col-sm-9">'
			+'<select name="operator" id="propertyConvertOperator" class="form-control select-control">'
			+convertOptHtml
			+'</select>'
			+'</div>'
			+'</div>'
			+'</div>'
			+'<div id="propertyConvertInput"></div>'
			+'</div>'
			+'<div class="row">'
			+'<div class="col-md-4"></div>'
			+'<div class="col-md-6"></div>'
			+'<div class="col-md-2 text-right outer">'
			+'<button id="propertyConvertAdd" type="button" class="btn btn-primary">'
			+'<span class="fa fa-plus">添加</span>'
			+'</button>'
			+'</div>'
			+'</div>'
	
			+'<!-- 转换条件预览 -->'
			+'<div class="row">'
			+'<table class="table table-hover container">'
			+'<caption>'
			+'<label class="control-label">&nbsp;&nbsp;预览:&nbsp;</label>'
			+'<code id="propertyConverPreview"></code>'
			+'</caption>'
			+'<colgroup>'
			+'<col width="33%"></col>'
		    +'<col width="33%"></col>'
		    +'<col width="33%"></col>'
		    +'</colgroup>'
			+'<thead>'
			+'<tr>'
			+'<th>操作</th>'
			+'<th>参数</th>'
			+'<th>删除</th>'
			+'</tr>'
			+'</thead>'
			+'<tbody id="propertyConvertList" index="'+index+'"></tbody>'
			+'</table>'
			+'</div>'
			+'</form>');
	
		BootstrapDialog.show({
			title : '数据转换',
			type : BootstrapDialog.TYPE_INFO,
			size : BootstrapDialog.SIZE_WIDE,
			message : function(dialog) {
				return $dialogHtml;
			},
			buttons : [ {
				label : '确定',
				cssClass : 'btn-primary',
				action : function(dialog) {
					// 组装目标源转换属性字段
					assembleConvertFields(dialog);
					dialog.close();
				}
			}, {
				label : '取消',
				action : function(dialog) {
					dialog.close();
				}
			} ]
		});

		// 初始化select2插件
		$dialogHtml.find(".select-control").select2({
			width : '100%',
			theme : "classic",
			// Infinity展示的Option个数不限制
			minimumResultsForSearch : Infinity
		});

		// 初始化目标源同步属性参数框
		initPropertyConvertPara($dialogHtml);

		// 绑定添加转换按钮事件
		bindEventForAddConvertCondition($dialogHtml);

		// 获取转化器配置对象
		var $convertor = driver.targetMapping.convertor;
		if ($convertor) {
			// 初始化已有目标源同步属性列表
			initPropertyConvertList($dialogHtml, $convertor[index]);
		}
	});

}

//***************************************************************************//
//*********************************** 基本配置 *********************************//
//初始化同步属性数据
function initPropertyList($propertyList, sourceFields, targetFields){
	var html = '';
	var sLen = sourceFields.length;
	var tLen = targetFields.length;
	if(sLen > 0 && sLen == tLen){
		//遍历初始化同步列表
		for (var i = 0; i < sLen; i++) {
			var sValue = sourceFields[i]['name'];
			var sType = sourceFields[i]['type'];
			var sTypeName = sourceFields[i]["typeName"];
			
			var tValue = targetFields[i]['name'];
			var tType = targetFields[i]['type'];
			var tTypeName = targetFields[i]["typeName"];
			var tr = '';
			tr += "<tr title='点击编辑' class='fastsyncer_pointer' index='"+i+"'> ";
			tr += "<td type='"+sType+"' typeName='"+sTypeName+"'>"+sValue+"</td>";
			tr += "<td type='"+tType+"' typeName='"+tTypeName+"'>"+tValue+"</td>";
			tr += "<td><a class='fa fa-remove fa-2x propertyDelete fastsyncer_pointer' title='删除' ></a></td>";
			tr += "</tr>";
			html += tr;
		}
	}
	// 1.将组装好的数据渲染给页面
	$propertyList.html(html);
	
	// 2.为基本配置中表格的Tr绑定转换目标源同步属性按钮事件
	bindEventForClickPropertyList($propertyList);
	
	// 3.删除同步属性按钮事件
	bindEventForDeleteProperty($(".propertyDelete"));
}

//校验唯一性
function checkPropertyUnique($propertyList, sValue, tValue){
	var isOk = true;
	var trs = $propertyList.find("tr");
	trs.each(function(i,o){
		var sField = $(this).find("td:eq(0)").text();
		var tField = $(this).find("td:eq(1)").text();
		//如果有重复添加，返回false
		if(sValue==sField && tValue==tField ){
			isOk = false;
			//结束校验
			return false;
		}
	});
	return isOk;
}

//计算转换器配置最新序号
//因为转换器配置和映射关系是通过序号对应关系,所以删除映射关系时都需要保证转换器配置和映射关系的序号变更一致.
// 映射关系：
//	数据源		目标源		序号
//	ID 			ID 			0
//	HRID 		ID 			1
//	BASENAME	USERNAME	2
// 转换器配置
//	{
//		"0":{aa},
//		"1":{bb},
//		"2":{cc}
//	}
//
//假设HRID对应的ID(序号为1)发生了删除操作后,期望效果如下
// 映射关系：
//	数据源		目标源		序号
//	ID 			ID 			0
//	BASENAME	USERNAME	1
// 转换器配置
//	{
//		"0":{aa},
//		"1":{cc}
//	}
/**
 * 计算转换器配置最新序号
 * @param d 删除的序号
 * @returns
 */
function shuffe(d){
	// 实现思路：
	// 首先从转换器配置中删除序号为d的配置.
	// 因为新增的映射关系只能追加到列表末尾,所以只需考虑删除场景.那么当前场景需要判断2个条件：
	// 假设序号为i,被删除的序号为d
	// 1.如果i<d,证明关系转换器配置中序号为i的配置未发生变化
	// 2.如果i>d,证明关系转换器配置中序号为i的配置需要减1（i=i-1）
	// tip:因为转换器配置中i为d的配置已删除,所以只用判断i>d.
	
	// 获取当前的转换器配置
	var sourceMapping = driver.targetMapping;
	var cvt = sourceMapping.convertor || {};
	// 从转换器配置中删除序号为d的配置
	delete cvt[d];
	// 默认清空转换器配置
	var convertor = {};
	// 遍历已有配置
	for(var i in cvt) {
		/**
		 *"0": [],
         *"1": []
         **/
		// 检查是否数字类型
		if(isNaN(i)){
			continue;
		}
		// 将i转换为数字类型
		var int = parseInt(i);
		
		// 未发生变化
		if(int < d){
			convertor[i] = cvt[i];
			continue;
		}
		// 序号需要减1
		if(int > d){
			int -= 1;
			convertor[int] = cvt[i];
			continue;
		}
	}
	sourceMapping['convertor'] = convertor;
}

//添加同步属性按钮事件
function bindEventForAddProperty($propertyAdd){
	$propertyAdd.click(function(){
		var sourceField = $("#propertySourceSelector").find(":selected");
		var targetField = $("#propertyTargetSelector").find(":selected");
		var $propertyList = $("#propertyList");
		// 如果有数据，那么前映射关系的序号为 +=1,但是当前默认序号从0开始计算,所以直接获取映射关系行数即可
		var index = $propertyList.find("tr").length;
	
		var sValue = sourceField.attr("value");
		var sType = sourceField.attr("type");
		var sTypeName = sourceField.attr("typeName");
		var tValue = targetField.attr("value");
		var tType = targetField.attr("type");
		var tTypeName = targetField.attr("typeName");
		//校验唯一性
		if(!checkPropertyUnique($propertyList, sValue, tValue)){
			bootGrowl('已添加该属性.',"danger"); 
			return;
		}
		var html = '';
		html += "<tr title='点击编辑' class='fastsyncer_pointer' index='"+index+"'> ";
		html += "<td type='"+ sType +"' typeName='"+sTypeName+"'>"+sValue+"</td>";
		html += "<td type='"+ tType +"' typeName='"+tTypeName+"'>"+tValue+"</td>";
		html += "<td><a class='fa fa-remove fa-2x propertyDelete fastsyncer_pointer' title='删除' ></a></td>";
		html += "</tr>";
		$propertyList.append(html);
		
		//重新绑定按钮删除事件
		bindEventForDeleteProperty($(".propertyDelete"));
		
		//为基本配置中表格的Tr绑定转换目标源同步属性按钮事件
		bindEventForClickPropertyList($propertyList);
	});
}

//删除同步属性按钮事件
function bindEventForDeleteProperty($propertyDelete){
	//删除同步属性按钮事件
	$propertyDelete.click(function(){
		// 删除一对映射关系
		var $tr = $(this).parent().parent();
		// 删除的序号
		var index = $tr.attr("index");
		// 删除当前映射关系
		$tr.remove();
		
		// 计算转换器配置最新序号
		shuffe(index);
		
		// 排序映射关系
		var $trs = $("#propertyList").find("tr");
		$.each($trs, function(i, value) {
			$(this).attr("index",i);
		});
	});
}

//绑定数据源下拉切换事件
function bindEventForSelector($sourceSelector, $targetSelector){
	$sourceSelector.change(function(){
		//选中的数据源字段
		var sourceVal = $(this).find(":selected").val();
		
		//自动匹配目标源相似字段
		$targetSelector.find("option").each(function(i,o){
			if(sourceVal==$(this).val()){
				$targetSelector.val(sourceVal).select2({
					width : "100%",
					theme : "classic"
				});
				return false;
			}
		});
	});
	$(".select-control").select2({
		width : "100%",
		theme : "classic"
	});
}

//初始化同步属性数据
function initPropertySelector($this, columns){
	if(columns){
		var colLen = columns.length;
		var opts = "<option value='' type='12' typeName='VARCHAR2' >空</option>";
		for (var i = 0; i < colLen; i++) {
			var col = columns[i];
			var name = col['name'];
			var type = col['type'];
			var typeName = col['typeName'];
			opts += "<option value='"+ name +"' type='"+ type +"' typeName='"+ typeName +"' >"+ name +" ("+typeName+")</option>";
		}
		$this.html(opts);
	}
}

$(function() {
	// 获取驱动数据源和目标源配置
	var sourceMapping = driver.sourceMapping;
	var targetMapping = driver.targetMapping;
	
	// 基本配置下拉
	var $sourceSelector = $("#propertySourceSelector");
	var $targetSelector = $("#propertyTargetSelector");
	var $propertyList = $("#propertyList");
	var $propertyAdd = $("#propertyAdd");
	
	// 1.初始化数据源/目标源select2插件
	initPropertySelector($sourceSelector, sourceMapping.config.column);
	initPropertySelector($targetSelector, targetMapping.config.column);
	
	// 2.绑定数据源下拉切换事件
	bindEventForSelector($sourceSelector, $targetSelector);
	
	// 3.初始化已有属性列表
	initPropertyList($propertyList, sourceMapping.fileds, targetMapping.fileds);
	
	// 4.同步属性按钮添加事件
	bindEventForAddProperty($propertyAdd);
	
});